﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Threading.Tasks;
using Negocio.clases_tontas;
using Datos;

namespace Negocio.catalogos
{
    public class catalogoReporte
    {
        catalogoEstudiante _objCatalogoEstudiante = new catalogoEstudiante();
        catalogoCabecera _objCatalogoCabecera = new catalogoCabecera();
        catalogoAsistencia _objCatalogoAsistencia = new catalogoAsistencia();
        List<asistenciaReporte> _objlista = new List<asistenciaReporte>();
        ControlAsistenciaEntities _objEntyti = new ControlAsistenciaEntities();
        catalogoDocente _objDocente = new catalogoDocente();
        catalogoDistribucion _objDistribucion = new catalogoDistribucion();
        /// <summary>
        /// Método para obtener los datos de las asistencia de los estudiantes de una distribucion
        /// </summary>
        /// <param name="idPeriodoActual">Código de periodo</param>
        /// <param name="codigoDistribucion">Codigo de distribucion</param>
        /// <param name="mes">Mes a consultar</param>
        /// <returns>Lista de asistencia</returns>
        public List<asistenciaReporte> obternerAsistenciaMensual(int idPeriodoActual, int codigoDistribucion, int mes, int anio)
        {

            try
            {

                DateTime diaHtml = DateTime.Now;

                var listadoEstudiante = _objCatalogoEstudiante.obtenerEstudiante(codigoDistribucion);

                var resultCabecera = from filtro in _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoFiltradoColumnas(codigoDistribucion, idPeriodoActual)
                                     where filtro.fechaCabecera.Month == mes
                                     select filtro;

                //try
                //{
                int nroLista = 0;
                int contador = 0;
                int totalMesActual = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(anio, mes, diaHtml.Day));
                int totalSemanal = new catalogoHorario().obtenerNroHoraHorarioSemanal(idPeriodoActual, codigoDistribucion);
                int totalHoraAcumuladas = _objCatalogoCabecera.obtenerHorasTrabajadasAcumuladas(codigoDistribucion, idPeriodoActual);
                var resultOpciones = new catalogoOpciones().obtenerNroSemanas(idPeriodoActual);

                if (resultOpciones != null)
                {
                    totalHoraAcumuladas = resultOpciones.nroSemanas * totalSemanal;
                }
                else
                {
                    totalHoraAcumuladas = 0;
                }


                foreach (var item in listadoEstudiante)
                {
                    contador = 0;
                    asistenciaReporte filaDeAsistencia = new asistenciaReporte();
                    nroLista++;
                    filaDeAsistencia.nroEstudiante = nroLista;
                    filaDeAsistencia.nombreEstudiante = item.Apellido_1.ToString() + ' ' + item.Nombres.ToString();

                    var listaAsistenica = new Dictionary<string, string>();
                    foreach (var itemAsistencia in resultCabecera)
                    {
                        contador++;

                        var resultJustificacion = _objCatalogoAsistencia.obtenerAsistenciaxIDDistribucionANDidEstudianteXfecha(codigoDistribucion, item.Id_Alumno, itemAsistencia.fechaCabecera).Count(C => C.idTipo.detalle == "J");
                        if (resultJustificacion > 0)
                        {
                            listaAsistenica.Add("dia" + contador, "J");
                        }
                        else
                        {
                            var resultAsistencia = _objCatalogoAsistencia.obtenerAsistenciaxIDDistribucionANDidEstudianteXfecha(codigoDistribucion, item.Id_Alumno, itemAsistencia.fechaCabecera).Count(C => C.idTipo.detalle == "A" || C.idTipo.detalle=="AF");
                            
                            listaAsistenica.Add("dia" + contador, resultAsistencia.ToString());
                        }

                    }

                    #region CargaDeColumnasDeDias
                    switch (listaAsistenica.Count)
                    {
                        case 1:
                            filaDeAsistencia.dia1 = listaAsistenica["dia1"];
                            break;
                        case 2:
                            filaDeAsistencia.dia1 = listaAsistenica["dia1"];
                            filaDeAsistencia.dia2 = listaAsistenica["dia2"];
                            break;
                        case 3:
                            filaDeAsistencia.dia1 = listaAsistenica["dia1"];
                            filaDeAsistencia.dia2 = listaAsistenica["dia2"];
                            filaDeAsistencia.dia3 = listaAsistenica["dia3"];
                            break;
                        case 4:
                            filaDeAsistencia.dia1 = listaAsistenica["dia1"];
                            filaDeAsistencia.dia2 = listaAsistenica["dia2"];
                            filaDeAsistencia.dia3 = listaAsistenica["dia3"];
                            filaDeAsistencia.dia4 = listaAsistenica["dia4"];
                            break;
                        case 5:
                            filaDeAsistencia.dia1 = listaAsistenica["dia1"];
                            filaDeAsistencia.dia2 = listaAsistenica["dia2"];
                            filaDeAsistencia.dia3 = listaAsistenica["dia3"];
                            filaDeAsistencia.dia4 = listaAsistenica["dia4"];
                            filaDeAsistencia.dia5 = listaAsistenica["dia5"];
                            break;
                        case 6:
                            filaDeAsistencia.dia1 = listaAsistenica["dia1"];
                            filaDeAsistencia.dia2 = listaAsistenica["dia2"];
                            filaDeAsistencia.dia3 = listaAsistenica["dia3"];
                            filaDeAsistencia.dia4 = listaAsistenica["dia4"];
                            filaDeAsistencia.dia5 = listaAsistenica["dia5"];
                            filaDeAsistencia.dia6 = listaAsistenica["dia6"];
                            break;
                        case 7:
                            filaDeAsistencia.dia1 = listaAsistenica["dia1"];
                            filaDeAsistencia.dia2 = listaAsistenica["dia2"];
                            filaDeAsistencia.dia3 = listaAsistenica["dia3"];
                            filaDeAsistencia.dia4 = listaAsistenica["dia4"];
                            filaDeAsistencia.dia5 = listaAsistenica["dia5"];
                            filaDeAsistencia.dia6 = listaAsistenica["dia6"];
                            filaDeAsistencia.dia7 = listaAsistenica["dia7"];
                            break;
                        case 8:
                            filaDeAsistencia.dia1 = listaAsistenica["dia1"];
                            filaDeAsistencia.dia2 = listaAsistenica["dia2"];
                            filaDeAsistencia.dia3 = listaAsistenica["dia3"];
                            filaDeAsistencia.dia4 = listaAsistenica["dia4"];
                            filaDeAsistencia.dia5 = listaAsistenica["dia5"];
                            filaDeAsistencia.dia6 = listaAsistenica["dia6"];
                            filaDeAsistencia.dia7 = listaAsistenica["dia7"];
                            filaDeAsistencia.dia8 = listaAsistenica["dia8"];
                            break;
                        case 9:
                            filaDeAsistencia.dia1 = listaAsistenica["dia1"];
                            filaDeAsistencia.dia2 = listaAsistenica["dia2"];
                            filaDeAsistencia.dia3 = listaAsistenica["dia3"];
                            filaDeAsistencia.dia4 = listaAsistenica["dia4"];
                            filaDeAsistencia.dia5 = listaAsistenica["dia5"];
                            filaDeAsistencia.dia6 = listaAsistenica["dia6"];
                            filaDeAsistencia.dia7 = listaAsistenica["dia7"];
                            filaDeAsistencia.dia8 = listaAsistenica["dia8"];
                            filaDeAsistencia.dia9 = listaAsistenica["dia9"];
                            break;
                        case 10:
                            filaDeAsistencia.dia1 = listaAsistenica["dia1"];
                            filaDeAsistencia.dia2 = listaAsistenica["dia2"];
                            filaDeAsistencia.dia3 = listaAsistenica["dia3"];
                            filaDeAsistencia.dia4 = listaAsistenica["dia4"];
                            filaDeAsistencia.dia5 = listaAsistenica["dia5"];
                            filaDeAsistencia.dia6 = listaAsistenica["dia6"];
                            filaDeAsistencia.dia7 = listaAsistenica["dia7"];
                            filaDeAsistencia.dia8 = listaAsistenica["dia8"];
                            filaDeAsistencia.dia9 = listaAsistenica["dia9"];
                            filaDeAsistencia.dia10 = listaAsistenica["dia10"];
                            break;
                        case 11:
                            filaDeAsistencia.dia1 = listaAsistenica["dia1"];
                            filaDeAsistencia.dia2 = listaAsistenica["dia2"];
                            filaDeAsistencia.dia3 = listaAsistenica["dia3"];
                            filaDeAsistencia.dia4 = listaAsistenica["dia4"];
                            filaDeAsistencia.dia5 = listaAsistenica["dia5"];
                            filaDeAsistencia.dia6 = listaAsistenica["dia6"];
                            filaDeAsistencia.dia7 = listaAsistenica["dia7"];
                            filaDeAsistencia.dia8 = listaAsistenica["dia8"];
                            filaDeAsistencia.dia9 = listaAsistenica["dia9"];
                            filaDeAsistencia.dia10 = listaAsistenica["dia10"];
                            filaDeAsistencia.dia10 = listaAsistenica["dia11"];
                            break;
                        case 12:
                            filaDeAsistencia.dia1 = listaAsistenica["dia1"];
                            filaDeAsistencia.dia2 = listaAsistenica["dia2"];
                            filaDeAsistencia.dia3 = listaAsistenica["dia3"];
                            filaDeAsistencia.dia4 = listaAsistenica["dia4"];
                            filaDeAsistencia.dia5 = listaAsistenica["dia5"];
                            filaDeAsistencia.dia6 = listaAsistenica["dia6"];
                            filaDeAsistencia.dia7 = listaAsistenica["dia7"];
                            filaDeAsistencia.dia8 = listaAsistenica["dia8"];
                            filaDeAsistencia.dia9 = listaAsistenica["dia9"];
                            filaDeAsistencia.dia10 = listaAsistenica["dia10"];
                            filaDeAsistencia.dia10 = listaAsistenica["dia11"];
                            filaDeAsistencia.dia10 = listaAsistenica["dia12"];
                            break;
                        default:
                            break;
                    }
                    #endregion

                    var asistenciaMesActual = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, mes, 1));
                    var asistenciaFeriado = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio, mes, 1));
                    var asistenciaJustificadaMesActual = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, mes, 1));
                    var asistenciaInjustificadaMesActual = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, mes, 1));
                    filaDeAsistencia.asistenciaAcumuladaMesActual = asistenciaMesActual;
                    filaDeAsistencia.faltasAcumuladaMesActual = asistenciaJustificadaMesActual;
                    filaDeAsistencia.faltasInjustificadasAcumuladaMesActual = asistenciaInjustificadaMesActual;

                    var inicioDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#00a65a");
                    var finDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#0073b7");
                    int mesCont = inicioDeClases.start.Value.Month;


                    var asistenciaAcumulada = 0;
                    var asistenciasFeriadoAcumulado = 0;
                    var faltasJustificadasAcumulada = 0;
                    var faltasInjustificadasAcumulada = 0;
                    int auxiliar = mes;
                    if (mesCont <= auxiliar)
                    {
                        while (mesCont <= mes)
                        {
                            asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, mesCont, diaHtml.Day));
                            faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, mesCont, diaHtml.Day));
                            faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, mesCont, diaHtml.Day));
                            asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio, mesCont, diaHtml.Day));
                            mesCont++;
                        }
                    }
                    else
                    {

                        if (mesCont >= auxiliar)
                        {
                            switch (auxiliar)
                            {
                                case 1:
                                    asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, auxiliar, diaHtml.Day));
                                    faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, auxiliar, diaHtml.Day));
                                    faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, auxiliar, diaHtml.Day));
                                    asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio, auxiliar, diaHtml.Day));
                                    auxiliar = 12;
                                    while (mesCont <= auxiliar)
                                    {
                                        asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                        faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                        faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                        asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio-1, auxiliar, diaHtml.Day));
                                        auxiliar--;
                                    }
                                    break;
                                case 2:
                                    asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, 2, diaHtml.Day));
                                    faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, 2, diaHtml.Day));
                                    faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, 2, diaHtml.Day));
                                    asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio, 2, diaHtml.Day));
                                    auxiliar--;
                                    if (auxiliar == 1)
                                    {
                                        asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, auxiliar, diaHtml.Day));
                                        faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, auxiliar, diaHtml.Day));
                                        faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, auxiliar, diaHtml.Day));
                                        asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio, auxiliar, diaHtml.Day));
                                        auxiliar = 12;
                                        while (mesCont <= auxiliar)
                                        {
                                            asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                            faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                            faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                            asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio-1, auxiliar, diaHtml.Day));
                                            auxiliar--;
                                        }
                                    }
                                    break;
                                case 3:
                                    asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, 3, diaHtml.Day));
                                    faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, 3, diaHtml.Day));
                                    faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, 3, diaHtml.Day));
                                    asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio, 3, diaHtml.Day));
                                    auxiliar = 2;
                                    if (auxiliar == 2)
                                    {
                                        asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, 2, diaHtml.Day));
                                        faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, 2, diaHtml.Day));
                                        faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, 2, diaHtml.Day));
                                        asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio, 2, diaHtml.Day));
                                        auxiliar--;
                                        if (auxiliar == 1)
                                        {
                                            asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, auxiliar, diaHtml.Day));
                                            faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, auxiliar, diaHtml.Day));
                                            faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, auxiliar, diaHtml.Day));
                                            asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio, auxiliar, diaHtml.Day));
                                            auxiliar = 12;
                                            while (mesCont <= auxiliar)
                                            {
                                                asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                                faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                                faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                                asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio-1, auxiliar, diaHtml.Day));
                                                auxiliar--;
                                            }
                                        }
                                    }
                                    break;
                                case 4:
                                    asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, 4, diaHtml.Day));
                                    faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, 4, diaHtml.Day));
                                    faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, 4, diaHtml.Day));
                                    asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio, 4, diaHtml.Day));
                                    auxiliar = 3;
                                    if (auxiliar == 3)
                                    {
                                        asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, 3, diaHtml.Day));
                                        faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, 3, diaHtml.Day));
                                        faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, 3, diaHtml.Day));
                                        asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio, 3, diaHtml.Day));
                                        auxiliar = 2;
                                        if (auxiliar == 2)
                                        {
                                            asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, 2, diaHtml.Day));
                                            faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, 2, diaHtml.Day));
                                            faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, 2, diaHtml.Day));
                                            asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio, 2, diaHtml.Day));
                                            auxiliar--;
                                            if (auxiliar == 1)
                                            {
                                                asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, auxiliar, diaHtml.Day));
                                                faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, auxiliar, diaHtml.Day));
                                                faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, auxiliar, diaHtml.Day));
                                                asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio, auxiliar, diaHtml.Day));
                                                auxiliar = 12;
                                                while (mesCont <= auxiliar)
                                                {
                                                    asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                                    faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                                    faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                                    asistenciasFeriadoAcumulado += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF", new DateTime(anio-1, auxiliar, diaHtml.Day));
                                                    auxiliar--;
                                                }
                                            }
                                        }
                                    }
                                    break;


                                //case 12:
                                //    while (mesCont >= mes)
                                //    {
                                //        asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio - 1, mes, diaHtml.Day));
                                //        faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio - 1, mes, diaHtml.Day));
                                //        faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio - 1, mes, diaHtml.Day));
                                //        mes--;
                                //    }
                                //    break;
                                default:
                                    break;
                            }
                        }
                    }


                    filaDeAsistencia.asistenciaAcumulada = asistenciaAcumulada+asistenciasFeriadoAcumulado;
                    filaDeAsistencia.faltasAcumulada = faltasJustificadasAcumulada;
                    filaDeAsistencia.faltasInjustificadasAcumualada = faltasInjustificadasAcumulada;


                    var totalAcumulada = asistenciaAcumulada + asistenciasFeriadoAcumulado + faltasInjustificadasAcumulada + faltasJustificadasAcumulada;

                    filaDeAsistencia.totalAsistencia = totalAcumulada;


                    if (asistenciaMesActual != 0)
                    {

                        filaDeAsistencia.asistenciaAcumuladaMesActualPorcentaje = Math.Round((((decimal)(asistenciaMesActual +asistenciaFeriado) / (decimal)totalMesActual) * 100), 2, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        filaDeAsistencia.asistenciaAcumuladaMesActualPorcentaje = 0;
                    }

                    if (asistenciaJustificadaMesActual != 0)
                    {
                        filaDeAsistencia.faltasAcumuladaMesActualPorcentaje = Math.Round((((decimal)asistenciaJustificadaMesActual / (decimal)totalMesActual) * 100), 2, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        filaDeAsistencia.faltasAcumuladaMesActualPorcentaje = 0;
                    }

                    if (asistenciaInjustificadaMesActual != 0)
                    {
                        filaDeAsistencia.faltasInjustificadasAcumuladaMesActualPorcentaje = Math.Round((((decimal)asistenciaInjustificadaMesActual / (decimal)totalMesActual) * 100), 2, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        filaDeAsistencia.faltasInjustificadasAcumuladaMesActualPorcentaje = 0;
                    }



                    if (asistenciaAcumulada != 0)
                    {
                        filaDeAsistencia.asistenciaAcumuladaPorcentaje = Math.Round((((decimal)(asistenciaAcumulada+asistenciaFeriado) / (decimal)totalHoraAcumuladas) * 100), 2, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        filaDeAsistencia.asistenciaAcumuladaPorcentaje = 0;
                    }

                    if ((faltasJustificadasAcumulada + faltasInjustificadasAcumulada) != 0)
                    {
                        filaDeAsistencia.faltasAcumuladaPorcentaje = Math.Round((((decimal)((decimal)faltasJustificadasAcumulada + (decimal)faltasInjustificadasAcumulada) / (decimal)totalHoraAcumuladas) * 100), 2, MidpointRounding.AwayFromZero);

                    }
                    else
                    {
                        filaDeAsistencia.faltasAcumuladaPorcentaje = 0;

                    }


                    if ((asistenciaAcumulada + (faltasJustificadasAcumulada + faltasInjustificadasAcumulada)) != 0)
                    {
                        filaDeAsistencia.totalAsistenciaPorcentaje = Math.Round((((decimal)(((decimal)asistenciaAcumulada + (decimal)asistenciasFeriadoAcumulado)+ (decimal)((decimal)faltasJustificadasAcumulada + (decimal)faltasInjustificadasAcumulada)) / (decimal)totalHoraAcumuladas) * 100), 2, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        filaDeAsistencia.totalAsistenciaPorcentaje = 0;
                    }


                    _objlista.Add(filaDeAsistencia);
                }

                return _objlista;
            }
            catch (Exception)
            {
                return _objlista;
            }
        }

        public List<horarioReporte> obtenerHorario(int idPeriodoActual, int codigoDistribucion)
        {
            catalogoHorario _objHorarioClases = new catalogoHorario();
            string horaInicio;
            string horaFin;
            int nroHoraDistribucion, totalDiario;
            List<horarioReporte> _objlistaHorario = new List<horarioReporte>();
            try
            {
                #region Datos Horario

                DateTime dia = DateTime.Now; //Obtiene dia actual
                string[] diasSemana = new string[] { "LU", "MA", "MI", "JU", "VI" };
                //Buscar inicio de semana
                //Inicio busqueda inicio de semana
                while (dia.DayOfWeek != DayOfWeek.Monday)
                {
                    if (dia.DayOfWeek == DayOfWeek.Sunday)
                    {
                        dia = dia.AddDays(1);
                    }
                    else
                    {
                        dia = dia.AddDays(-1);
                    }
                }

                //Carga del horario para validacion
                var consultaHorario = _objHorarioClases.obtenerHorarioXidPeriodoANDidDistribucion(idPeriodoActual, codigoDistribucion);

                if (consultaHorario.Count() > 0)
                {
                    for (int i = 0; i < 5; i++)
                    {
                        horaInicio = "";
                        horaFin = "";
                        nroHoraDistribucion = 0;
                        totalDiario = 0;
                        var resultFiltroHorario = consultaHorario.Where(E => E.detalle == dia.DayOfWeek.ToString()).ToList();

                        if (resultFiltroHorario.Count > 0)
                        {
                            TimeSpan _intervaloHoraEntradaPrimero = TimeSpan.Parse(resultFiltroHorario.First().horaEntrada);
                            TimeSpan _intervaloHoraSalidaUltimo = TimeSpan.Parse(resultFiltroHorario.First().horaSalida);
                            foreach (var item in resultFiltroHorario)
                            {
                                if (dia.DayOfWeek.ToString() == item.detalle)
                                {

                                    TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.horaEntrada);
                                    TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.horaSalida);

                                    DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                    DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin

                                    nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;
                                    totalDiario += nroHoraDistribucion;

                                    if (_intervaloHoraEntrada <= _intervaloHoraEntradaPrimero)
                                    {
                                        horaInicio = _intervaloHoraEntrada.ToString(@"hh\:mm");
                                    }

                                    if (_intervaloHoraSalida >= _intervaloHoraSalidaUltimo)
                                    {
                                        horaFin = _intervaloHoraSalida.ToString(@"hh\:mm");
                                    }
                                }
                                //fin busqueda dia de la semana                             
                            }
                            _objlistaHorario.Add(new horarioReporte(diasSemana[i], horaInicio, horaFin, totalDiario.ToString()));
                        }
                        else
                        {
                            _objlistaHorario.Add(new horarioReporte(diasSemana[i], horaInicio, horaFin, nroHoraDistribucion.ToString()));
                        }

                        dia = dia.AddDays(1);
                    }
                    return _objlistaHorario;

                }
                else
                {
                    return _objlistaHorario;

                }
                #endregion
            }
            catch (Exception)
            {
                return _objlistaHorario;
            }
        }

        public List<asistenciaGeneral> obtenerAsistenciaGeneral(int idPeriodoActual, int codigoDistribucion)
        {
            List<asistenciaGeneral> _objListaAsistencia = new List<asistenciaGeneral>();
            catalogoEstudiante _objCatalogoEstudiante = new catalogoEstudiante();
            catalogoCabecera _objCatalogoCabecera = new catalogoCabecera();
            catalogoAsistencia _objCatalogoAsistencia = new catalogoAsistencia();
            try
            {

                DateTime diaHtml = DateTime.Now;

                var listadoEstudiante = _objCatalogoEstudiante.obtenerEstudiante(codigoDistribucion);

                //try
                //{
                int nroLista = 0;
                int totalHoraAcumuladas = _objCatalogoCabecera.obtenerHorasTrabajadasAcumuladas(codigoDistribucion, idPeriodoActual);
                int totalSemanal = new catalogoHorario().obtenerNroHoraHorarioSemanal(idPeriodoActual, codigoDistribucion);

                //var resultOpciones = new catalogoOpciones().obtenerNroSemanas(idPeriodoActual);

                //if (resultOpciones != null)
                //{
                //    totalHoraAcumuladas = resultOpciones.nroSemanas * totalSemanal;
                //}
                //else
                //{
                //    totalHoraAcumuladas = 0;
                //}


                foreach (var item in listadoEstudiante)
                {
                    asistenciaGeneral filaDeAsistencia = new asistenciaGeneral();
                    nroLista++;
                    filaDeAsistencia.nroEstudiante = nroLista;
                    filaDeAsistencia.nombreEstudiante = item.Apellido_1.ToString() + ' ' + item.Nombres.ToString();

                    var asistenciaFeriadoAcumulada= _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipo(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "AF");
                    var asistenciaAcumulada = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipo(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A");
                    var faltasJustificadasAcumulada = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipo(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J");
                    var faltasInjustificadasAcumulada = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipo(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F");

                    filaDeAsistencia.asistenciaFeriadoAcumulada = asistenciaFeriadoAcumulada;
                    filaDeAsistencia.asistenciaAcumulada = asistenciaAcumulada;
                    filaDeAsistencia.faltasAcumulada = faltasJustificadasAcumulada;
                    filaDeAsistencia.faltasInjustificadasAcumualada = faltasInjustificadasAcumulada;


                    if (asistenciaAcumulada != 0)
                    {
                        filaDeAsistencia.asistenciaAcumuladaPorcentaje = Math.Round((((decimal)(asistenciaAcumulada+asistenciaFeriadoAcumulada) / (decimal)totalHoraAcumuladas) * 100), 2, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        filaDeAsistencia.asistenciaAcumuladaPorcentaje = 0;
                    }

                    if ((faltasJustificadasAcumulada + faltasInjustificadasAcumulada) != 0)
                    {
                        filaDeAsistencia.faltasAcumuladaPorcentaje = Math.Round((((decimal)((decimal)faltasJustificadasAcumulada + (decimal)faltasInjustificadasAcumulada) / (decimal)totalHoraAcumuladas) * 100), 2, MidpointRounding.AwayFromZero);

                    }
                    else
                    {
                        filaDeAsistencia.faltasAcumuladaPorcentaje = 0;
                    }

                    if ((asistenciaAcumulada + asistenciaFeriadoAcumulada + (faltasJustificadasAcumulada + faltasInjustificadasAcumulada)) != 0)
                    {
                        filaDeAsistencia.totalAsistenciaPorcentaje = Math.Round(((decimal)((decimal)((decimal)(asistenciaAcumulada +asistenciaFeriadoAcumulada )+ (decimal)((decimal)faltasJustificadasAcumulada + (decimal)faltasInjustificadasAcumulada)) / (decimal)totalHoraAcumuladas) * 100), 2, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        filaDeAsistencia.totalAsistenciaPorcentaje = 0;
                    }

                    if (filaDeAsistencia.asistenciaAcumuladaPorcentaje < 85)
                    {
                        filaDeAsistencia.observacion = "NO ACREDITA PARA PRESENTARSE A EXAMEN";
                    }
                    else
                    {
                        filaDeAsistencia.observacion = "NIVEL DE ASISTENCIA APROBADO";
                    }

                    _objListaAsistencia.Add(filaDeAsistencia);
                }

                return _objListaAsistencia;

            }
            catch (Exception)
            {

                return _objListaAsistencia;
            }
        }

        public List<horasTrabajadasReporte> obtenerResumenHora(int _horaTrabajadas, int _horaNoTrabajadas)
        {
            List<horasTrabajadasReporte> _objListaHora = new List<horasTrabajadasReporte>();

            try
            {
                _objListaHora.Add(new horasTrabajadasReporte("TOTAL DE HORAS NO TRABAJADAS:", _horaNoTrabajadas));
                _objListaHora.Add(new horasTrabajadasReporte("TOTAL DE HORAS:", _horaTrabajadas));
                return _objListaHora;
            }
            catch (Exception)
            {

                return _objListaHora;
            }
        }

        public List<horasTrabajadasReporte> obtenerResumenEstudiantes(int _acreditados, int _noAcreditados)
        {
            List<horasTrabajadasReporte> _objListaHora = new List<horasTrabajadasReporte>();

            try
            {
                _objListaHora.Add(new horasTrabajadasReporte("ESTUDIANTES ACREDITADOS", _acreditados));
                _objListaHora.Add(new horasTrabajadasReporte("ESTUDIANTES NO ACREDITADOS", _noAcreditados));
                return _objListaHora;
            }
            catch (Exception)
            {

                return _objListaHora;
            }
        }

        public List<bitacoraReporte> obtenerBitacora(int _idCarrera, int _idPeriodo)
        {
            List<bitacoraReporte> _objLista = new List<bitacoraReporte>();

            try
            {
                var resultPeriodo = new catalogoPeriodo().obtenerPeriodo(_idPeriodo).FirstOrDefault();
                var resultListaDocentes = new catalogoDocente().consultarDocentesXIdCarrera(_idCarrera);
                foreach (var item in resultListaDocentes)
                {
                    var resulDistribuciones = new catalogoDistribucion().obtenerDistribucion(item.idDocente);
                    foreach (var itemDistribucion in resulDistribuciones)
                    {
                        bitacoraReporte _filaLista = new bitacoraReporte();

                        _filaLista.nombreDocente = item.nombre + " " + item.apellido1 + " " + item.apellido2;
                        _filaLista.nombreMateria = itemDistribucion.Nombre;
                        _filaLista.semestre = itemDistribucion.semestre + " " + itemDistribucion.paralelo;
                        int totalHoraAcumuladas = new catalogoCabecera().obtenerHorasTrabajadasAcumuladas(itemDistribucion.idDistribucion, _idPeriodo);
                        // 2 Justificada / 3 injustificada
                        var horasJustificada = new catalogoBitacora().obtenerBitocaraXidDistribucionANDXTipo(itemDistribucion.idDistribucion, _idPeriodo, 2).Sum(E => E.nroHoras);
                        var horasINJustificada = new catalogoBitacora().obtenerBitocaraXidDistribucionANDXTipo(itemDistribucion.idDistribucion, _idPeriodo, 2).Sum(E => E.nroHoras);

                        int totalHorasEfectivas = totalHoraAcumuladas - horasINJustificada - horasJustificada;

                        _filaLista.horastrabajadas = totalHorasEfectivas;
                        _filaLista.horasJustificadas = horasJustificada;
                        _filaLista.horasInJustificadas = horasINJustificada;
                        _objLista.Add(_filaLista);
                    }
                }

                return _objLista;
            }
            catch (Exception)
            {

                return _objLista;
            }

        }

        public List<bitacoraReporte> obtenerBitacoraXsemestreXparalelo(int _idCarrera, int _idPeriodo, int _semestre, string _paralelo)
        {
            List<bitacoraReporte> _objLista = new List<bitacoraReporte>();

            try
            {
                var resultPeriodo = new catalogoPeriodo().obtenerPeriodo(_idPeriodo).FirstOrDefault();

                var resulDistribuciones = new catalogoDistribucion().obtenerDistribucionXSemestre(_semestre, _idCarrera, _paralelo);
                foreach (var itemDistribucion in resulDistribuciones)
                {
                    bitacoraReporte _filaLista = new bitacoraReporte();
                    var resultDistribucion = new catalogoDistribucion().obtenerDistribucionId(itemDistribucion.idDistribucion).FirstOrDefault();
                    if (resultDistribucion != null)
                    {
                        var resulDocente = new catalogoDocente().consultarDocenteXId(resultDistribucion.idDocente);
                        _filaLista.nombreDocente = resulDocente.nombre + " " + resulDocente.apellido1 + " " + resulDocente.apellido2;
                    }
                    else
                    {
                        _filaLista.nombreDocente = " ";
                    }


                    _filaLista.nombreMateria = itemDistribucion.Nombre;
                    _filaLista.semestre = itemDistribucion.semestre + " " + itemDistribucion.paralelo;
                    int totalHoraAcumuladas = new catalogoCabecera().obtenerHorasTrabajadasAcumuladas(itemDistribucion.idDistribucion, _idPeriodo);
                    // 2 Justificada / 3 injustificada
                    var horasJustificada = new catalogoBitacora().obtenerBitocaraXidDistribucionANDXTipo(itemDistribucion.idDistribucion, _idPeriodo, 2).Sum(E => E.nroHoras);
                    var horasINJustificada = new catalogoBitacora().obtenerBitocaraXidDistribucionANDXTipo(itemDistribucion.idDistribucion, _idPeriodo, 3).Sum(E => E.nroHoras);

                    int totalHorasEfectivas = totalHoraAcumuladas - horasINJustificada - horasJustificada;

                    _filaLista.horastrabajadas = totalHorasEfectivas;
                    _filaLista.horasJustificadas = horasJustificada;
                    _filaLista.horasInJustificadas = horasINJustificada;
                    _objLista.Add(_filaLista);
                }

                return _objLista;
            }
            catch (Exception)
            {

                return _objLista;
            }

        }

        public string reporteObservaciones(int _idPeriodo, DateTime _fechaMes)
        {
            StringBuilder _textObservacion = new StringBuilder();
            try
            {
                _textObservacion.Clear();
                var resultCalendario = new catalogoCalendarioAcademico().obtenerCalendarioAcademicoxPeriodoANdMEs(_idPeriodo, _fechaMes);
                if (resultCalendario.Count != 0)
                {
                    _textObservacion.Append("<p> Feriado:<br>");
                    foreach (var item in new catalogoCalendarioAcademico().obtenerCalendarioAcademicoxPeriodoANdMEs(_idPeriodo, _fechaMes))
                    {
                        _textObservacion.Append(item.start.Value.ToShortDateString() + ": " + item.title + "<br>");
                    }
                    _textObservacion.Append("</p>");
                }

                return _textObservacion.ToString();

            }
            catch (Exception)
            {

                return "Error en el servidor.";
            }
        }


        /// <summary>
        /// reporte mensual del registro de asistencias de los docentes
        /// </summary>
        /// <param name="periodo"></param>
        /// <param name="mes"></param>
        /// <param name="carrera"></param>
        /// <param name="semestre"></param>
        /// <returns></returns>
        public List<asistenciaReporte> consultarReporteMensualRegistro(int periodo, int mes, int anio, int carrera, int semestre)
        {


            List<asistenciaReporte> lista = new List<asistenciaReporte>();
            var Docentes = _objDocente.consultarDocentesXIdCarrera(Convert.ToInt32(carrera));

            DateTime fechaIni = DateTime.Now, fechaFi = DateTime.Now;
            switch (Convert.ToInt32(mes))
            {
                case 1:
                    fechaFi = Convert.ToDateTime(anio + "-" + 1 + "-" + 31);
                    fechaIni = Convert.ToDateTime(anio + "-" + 1 + "-" + 1);
                    break;
                case 2:
                    fechaFi = Convert.ToDateTime(anio + "-" + 2 + "-" + 28);
                    fechaIni = Convert.ToDateTime(anio + "-" + 2 + "-" + 1); break;
                case 3:
                    fechaFi = Convert.ToDateTime(anio + "-" + 3 + "-" + 31);
                    fechaIni = Convert.ToDateTime(anio + "-" + 3 + "-" + 1); break;
                case 4:
                    fechaFi = Convert.ToDateTime(anio + "-" + 4 + "-" + 30);
                    fechaIni = Convert.ToDateTime(anio + "-" + 4 + "-" + 1); break;
                case 5:
                    fechaFi = Convert.ToDateTime(anio + "-" + 5 + "-" + 31);
                    fechaIni = Convert.ToDateTime(anio + "-" + 5 + "-" + 1); break;
                case 6:
                    fechaFi = Convert.ToDateTime(anio + "-" + 6 + "-" + 30);
                    fechaIni = Convert.ToDateTime(anio + "-" + 6 + "-" + 1); break;
                case 7:
                    fechaFi = Convert.ToDateTime(anio + "-" + 7 + "-" + 31);
                    fechaIni = Convert.ToDateTime(anio + "-" + 7 + "-" + 1); break;
                case 8:
                    fechaFi = Convert.ToDateTime(anio + "-" + 8 + "-" + 31);
                    fechaIni = Convert.ToDateTime(anio + "-" + 8 + "-" + 1); break;
                case 9:
                    fechaFi = Convert.ToDateTime(anio + "-" + 9 + "-" + 30);
                    fechaIni = Convert.ToDateTime(anio + "-" + 9 + "-" + 1); break;
                case 10:
                    fechaFi = Convert.ToDateTime(anio + "-" + 10 + "-" + 31);
                    fechaIni = Convert.ToDateTime(anio + "-" + 10 + "-" + 1); break;
                case 11:
                    fechaFi = Convert.ToDateTime(anio + "-" + 11 + "-" + 30);
                    fechaIni = Convert.ToDateTime(anio + "-" + 11 + "-" + 1); break;
                case 12:
                    fechaFi = Convert.ToDateTime(anio + "-" + 12 + "-" + 31);
                    fechaIni = Convert.ToDateTime(anio + "-" + 12 + "-" + 1); break;
                default: break;
            }
            foreach (var item in Docentes)
            {
                //var distribuciones = _objDistribucion.obtenerDistribucionXSemestre(Convert.ToInt32(semestre), Convert.ToInt32(carrera), paralelo);
                int contadorDocente = 0, contadorSistema = 0;
                var distro = _objDistribucion.obtenerDistribucionDocentePeriodo(item.idDocente, periodo);
                foreach (var item2 in distro)
                {
                    if (item2.semestre == semestre)
                    {
                        var datos = _objEntyti.procConsultarRegistroProfesores(item2.idDistribucion, periodo, fechaIni, fechaFi);
                        foreach (var item3 in datos.ToList())
                        {
                            if (item3.idObservacion == 211048)
                            {
                                contadorDocente += 1;
                            }
                            else
                            {
                                contadorSistema += 1;
                            }
                        }
                        double porcentajeDocente = 0;
                        double porcentajeSistema2 = 0;
                        if (contadorSistema > 0 && contadorDocente > 0)
                        {

                            porcentajeSistema2 = ((double)(contadorSistema * 100) / (contadorDocente + contadorSistema));
                            porcentajeDocente = (100 - porcentajeSistema2);
                        }
                        else if (contadorDocente > 0 || contadorSistema > 0)
                        {

                            if (contadorDocente > 0)
                            {
                                porcentajeDocente = ((double)(contadorDocente * 100) / (contadorDocente + contadorSistema));
                                porcentajeSistema2 = 100 - porcentajeDocente;
                            }
                            else
                            {
                                porcentajeSistema2 = ((double)(contadorSistema * 100) / (contadorDocente + contadorSistema));
                                porcentajeDocente = 100 - porcentajeSistema2;
                            }
                        }

                        lista.Add(new asistenciaReporte { nombreDocente = item.nombre, nombreMateria = item2.Nombre, ingresoDocente = contadorDocente.ToString(), ingresoSistema = contadorSistema.ToString(), totalAsistencia = contadorDocente + contadorSistema, porcentajeDocente = porcentajeDocente.ToString("0.##"), porcentajeSistema = porcentajeSistema2.ToString("0.##") });
                    }
                }
            }
            return lista;
        }


        public List<asistenciaReporte> consultarReporteDiarioCurso(string _dia, int _periodo, int _carrera, int _semestre, string _paralelo, DateTime fecha)
        {
            List<asistenciaReporte> lista = new List<asistenciaReporte>();
            catalogoHorario _objHorario = new catalogoHorario();
            var distribuciones = _objDistribucion.obtenerDistribucionXSemestre(_semestre, _carrera, _paralelo);
            // para obtener la disctribucion con mas estudiantes
            int numeroDistribucion = 0; int numeroEstudiantes = 0;
            List<Negocio.clases_tontas.horarioClases> _lista = new List<Negocio.clases_tontas.horarioClases>();
            foreach (var item in distribuciones)
            {
                var estudiantes = new catalogoEstudiante().obtenerEstudiante(item.idDistribucion);

                if (estudiantes.Count() > 0)
                {
                    if (numeroDistribucion == 0)
                    {
                        numeroDistribucion = item.idDistribucion;
                        numeroEstudiantes = estudiantes.Count();
                    }
                    else if (numeroEstudiantes > estudiantes.Count())
                    {
                        numeroDistribucion = item.idDistribucion;
                        numeroEstudiantes = estudiantes.Count();
                    }
                }
                var horas = _objHorario.consultarDistribucionesDiarias(fecha.DayOfWeek.ToString(), item.idDistribucion, _periodo).Where(C => C.fecha == Convert.ToDateTime(fecha));
                if (horas.Count() > 0)
                {
                    foreach (var item2 in horas)
                    {
                        var materia = _objDistribucion.obtenerDistribucionId(item.idDistribucion).FirstOrDefault();
                        _lista.Add(new Negocio.clases_tontas.horarioClases { profesor = "", materia = materia.Nombre, horaEntrada = item2.horaEntrada, horaSalida = item2.horaSalida, observacion = item2.observacion, idDistribucionInt = (int)item2.idDistribucionInt, idCabecera = item2.idCabecera });

                    }
                }

            }
            if (_lista.Count() > 0)
            {
                var estudiantes2 = new catalogoEstudiante().obtenerEstudiante(numeroDistribucion);
                int contador = 1;
                foreach (var item2 in estudiantes2)
                {
                    var nombres = new catalogoEstudiante().obtenerEstudianteXID(item2.Id_Alumno).FirstOrDefault();


                    int posicion = 0;
                    string dia1 = "", dia2 = "", dia3 = "", dia4 = "", dia5 = "";
                    foreach (var item in _lista.OrderBy(C => C.horaEntrada))
                    {
                        //var distribucionesDiarias = _objEntyti.procConsultarDistribucionesxDias(_dia, item.idDistribucionInt).Where(C => C.fechaCabecera == fecha);
                        var cabeceras = _objCatalogoAsistencia.consultarAsistenciasxCabeceraFechaEstudiante(item.idCabecera, fecha, item2.Id_Alumno);
                        if (cabeceras.Count() == 1 && posicion == 0)
                        {
                            dia1 = cabeceras.FirstOrDefault().observacion.ToString();

                            posicion = 1;

                        }
                        else
                            if (cabeceras.Count() == 1 && posicion == 1)
                        {
                            dia2 = cabeceras.FirstOrDefault().observacion.ToString();
                            posicion = 2;

                        }
                        else
                                if (cabeceras.Count() == 1 && posicion == 2)
                        {
                            dia3 = cabeceras.FirstOrDefault().observacion.ToString();
                            posicion = 3;

                        }
                        else
                                    if (cabeceras.Count() == 1 && posicion == 3)
                        {
                            dia4 = cabeceras.FirstOrDefault().observacion.ToString();
                            posicion = 4;

                        }
                        else
                                        if (cabeceras.Count() == 1 && posicion == 4)
                        {
                            dia5 = cabeceras.FirstOrDefault().observacion.ToString();
                            posicion = 5;

                        }
                        else if (cabeceras.Count() == 2 && posicion == 0)
                        {
                            int c = 0;
                            foreach (var item3 in cabeceras)
                            {
                                if (c == 0)
                                {
                                    dia1 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;

                                }
                                else
                                {
                                    dia2 = cabeceras.FirstOrDefault().observacion.ToString();

                                }
                                posicion = 2;
                            }
                        }
                        else if (cabeceras.Count() == 2 && posicion == 1)
                        {
                            int c = 0;
                            foreach (var item3 in cabeceras)
                            {
                                if (c == 0)
                                {
                                    dia2 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;

                                }
                                else
                                {
                                    dia3 = cabeceras.FirstOrDefault().observacion.ToString();

                                }
                                posicion = 3;
                            }
                        }
                        else if (cabeceras.Count() == 2 && posicion == 2)
                        {
                            int c = 0;
                            foreach (var item3 in cabeceras)
                            {
                                if (c == 0)
                                {
                                    dia3 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;
                                }
                                else
                                {
                                    dia4 = cabeceras.FirstOrDefault().observacion.ToString();
                                }
                                posicion = 4;
                            }
                        }
                        else if (cabeceras.Count() == 2 && posicion == 3)
                        {
                            int c = 0;
                            foreach (var item3 in cabeceras)
                            {
                                if (c == 0)
                                {
                                    dia4 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;
                                }
                                else
                                {
                                    dia5 = cabeceras.FirstOrDefault().observacion.ToString();
                                }
                                posicion = 5;
                            }
                        }
                        else if (cabeceras.Count() == 2 && posicion == 4)
                        {
                            int c = 0;
                            foreach (var item3 in cabeceras)
                            {
                                if (c == 0)
                                {
                                    dia5 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;

                                }
                                posicion = 5;
                            }
                        }
                        ////////////////////////////////////////////////////////////////////////////////////////           para 3 cabeceras (horarios dividivos en 3 ingresos)
                        else if (cabeceras.Count() == 3 && posicion == 0)
                        {
                            int c = 0;
                            foreach (var item3 in cabeceras)
                            {
                                if (c == 0)
                                {
                                    dia1 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;

                                }
                                else if (c == 1)
                                {
                                    dia2 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;
                                }
                                else
                                {
                                    dia3 = cabeceras.FirstOrDefault().observacion.ToString();
                                }
                                posicion = 3;
                            }
                        }
                        else if (cabeceras.Count() == 3 && posicion == 1)
                        {
                            int c = 0;
                            foreach (var item3 in cabeceras)
                            {
                                if (c == 0)
                                {
                                    dia2 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;
                                }
                                else if (c == 1)
                                {
                                    dia3 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;

                                }
                                else
                                {
                                    dia4 = cabeceras.FirstOrDefault().observacion.ToString();
                                }
                                posicion = 4;
                            }
                        }
                        else if (cabeceras.Count() == 3 && posicion == 2)
                        {
                            int c = 0;
                            foreach (var item3 in cabeceras)
                            {
                                if (c == 0)
                                {
                                    dia3 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;
                                }
                                else if (c == 1)
                                {
                                    dia4 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;
                                }
                                else
                                {
                                    dia5 = cabeceras.FirstOrDefault().observacion.ToString();
                                }
                                posicion = 5;
                            }
                        }
                        ////////////////////////////////////////////////////////////////////////////////////////           para 4 cabeceras (horarios dividivos en 3 ingresos)   
                        else if (cabeceras.Count() == 4 && posicion == 0)
                        {
                            int c = 0;
                            foreach (var item3 in cabeceras)
                            {
                                if (c == 0)
                                {
                                    dia1 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;

                                }
                                else if (c == 1)
                                {
                                    dia2 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;
                                }
                                else if (c == 2)
                                {
                                    dia3 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;
                                }
                                else
                                {
                                    dia4 = cabeceras.FirstOrDefault().observacion.ToString();
                                }
                                posicion = 3;
                            }
                        }
                        else if (cabeceras.Count() == 4 && posicion == 1)
                        {
                            int c = 0;
                            foreach (var item3 in cabeceras)
                            {
                                if (c == 0)
                                {
                                    dia2 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;

                                }
                                else if (c == 1)
                                {
                                    dia3 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;
                                }
                                else if (c == 2)
                                {
                                    dia4 = cabeceras.FirstOrDefault().observacion.ToString();
                                    c += 1;
                                }
                                else
                                {
                                    dia5 = cabeceras.FirstOrDefault().observacion.ToString();
                                }
                                posicion = 3;
                            }
                        }

                    }
                    ///PARA COLOCAR Q TIENE INASSISTENCIAS
                    if (dia1 == "3")
                    {
                        dia1 = "0";
                    }
                    if (dia2 == "3")
                    {
                        dia2 = "0";
                    }
                    if (dia3 == "3")
                    {
                        dia3 = "0";
                    }
                    if (dia4 == "3")
                    {
                        dia4 = "0";
                    }
                    if (dia5 == "3")
                    {
                        dia5 = "0";
                    }
                    /// PARA COLOCAR JUSTIFICACION 
                    if (dia1 == "2")
                    {
                        dia1 = "J";
                    }
                    if (dia2 == "2")
                    {
                        dia2 = "J";
                    }
                    if (dia3 == "2")
                    {
                        dia3 = "J";
                    }
                    if (dia4 == "2")
                    {
                        dia4 = "J";
                    }
                    if (dia5 == "2")
                    {
                        dia5 = "J";
                    }
                    lista.Add(new asistenciaReporte { nombreEstudiante = nombres.Nombres, nroEstudiante = contador, dia1s = dia1.ToString(), dia2s = dia2, dia3s = dia3, dia4s = dia4, dia5s = dia5 });
                    contador += 1;
                }
                return lista;
            }
            else
            {
                return lista;
            }


        }
        /// <summary>
        /// REPORTE DE ESTUDIANTES PERDIDOS EN FALTAS HASTA EL MOMENTO
        /// </summary>
        /// <param name="idPeriodoActual"></param>
        /// <param name="codigoDistribucion"></param>
        /// <returns></returns>
        public List<asistenciaReporte> reportePerdedores(int idPeriodoActual, int codigoDistribucion)
        {

            try
            {

                DateTime diaHtml = DateTime.Now;

                var listadoEstudiante = _objCatalogoEstudiante.obtenerEstudiante(codigoDistribucion);

                var resultCabecera = from filtro in _objCatalogoCabecera.obtenerCabeceraXIdDistribucionANDidPeridoFiltradoColumnas(codigoDistribucion, idPeriodoActual)
                                     where filtro.fechaCabecera.Month == DateTime.Now.Month
                                     select filtro;

                int nroLista = 0;
               // int contador = 0;
                int totalMesActual = _objCatalogoCabecera.obtenerHorasTrabajadasMesActual(codigoDistribucion, idPeriodoActual, new DateTime(DateTime.Now.Year, DateTime.Now.Month, diaHtml.Day));
                int totalSemanal = new catalogoHorario().obtenerNroHoraHorarioSemanal(idPeriodoActual, codigoDistribucion);
                int totalHoraAcumuladas = _objCatalogoCabecera.obtenerHorasTrabajadasAcumuladas(codigoDistribucion, idPeriodoActual);
                var resultOpciones = new catalogoOpciones().obtenerNroSemanas(idPeriodoActual);

                if (resultOpciones != null)
                {
                    totalHoraAcumuladas = resultOpciones.nroSemanas * totalSemanal;
                }
                else
                {
                    totalHoraAcumuladas = 0;
                }


                foreach (var item in listadoEstudiante)
                {
                    //contador = 0;
                    asistenciaReporte filaDeAsistencia = new asistenciaReporte();

                    filaDeAsistencia.nombreEstudiante = item.Apellido_1.ToString() + ' ' + item.Nombres.ToString();

                    var listaAsistenica = new Dictionary<string, string>();

                    var asistenciaMesActual = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1));
                    var asistenciaJustificadaMesActual = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1));
                    var asistenciaInjustificadaMesActual = _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1));
                    filaDeAsistencia.asistenciaAcumuladaMesActual = asistenciaMesActual;
                    filaDeAsistencia.faltasAcumuladaMesActual = asistenciaJustificadaMesActual;
                    filaDeAsistencia.faltasInjustificadasAcumuladaMesActual = asistenciaInjustificadaMesActual;

                    var inicioDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#00a65a");
                    var finDeClases = new catalogoCalendarioAcademico().obtenerInicioANDFinDeClases(idPeriodoActual, "#0073b7");
                    int mesCont = inicioDeClases.start.Value.Month;

                    var asistenciaAcumulada = 0;
                    var faltasJustificadasAcumulada = 0;
                    var faltasInjustificadasAcumulada = 0;
                    int auxiliar = DateTime.Now.Month;
                    int anio = DateTime.Now.Year;
                    if (mesCont <= auxiliar)
                    {
                        while (mesCont <= auxiliar)
                        {
                            asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, mesCont, diaHtml.Day));
                            faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, mesCont, diaHtml.Day));
                            faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, mesCont, diaHtml.Day));
                            mesCont++;
                        }
                    }
                    else
                    {

                        if (mesCont >= auxiliar)
                        {
                            switch (auxiliar)
                            {
                                case 1:
                                    asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, auxiliar, diaHtml.Day));
                                    faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, auxiliar, diaHtml.Day));
                                    faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, auxiliar, diaHtml.Day));
                                    auxiliar = 12;
                                    while (mesCont <= auxiliar)
                                    {
                                        asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                        faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                        faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                        auxiliar--;
                                    }
                                    break;
                                case 2:
                                    asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, 2, diaHtml.Day));
                                    faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, 2, diaHtml.Day));
                                    faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, 2, diaHtml.Day));
                                    auxiliar--;
                                    if (auxiliar == 1)
                                    {
                                        asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, auxiliar, diaHtml.Day));
                                        faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, auxiliar, diaHtml.Day));
                                        faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, auxiliar, diaHtml.Day));
                                        auxiliar = 12;
                                        while (mesCont <= auxiliar)
                                        {
                                            asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                            faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                            faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                            auxiliar--;
                                        }
                                    }
                                    break;
                                case 3:
                                    asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, 3, diaHtml.Day));
                                    faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, 3, diaHtml.Day));
                                    faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, 3, diaHtml.Day));
                                    auxiliar = 2;
                                    if (auxiliar == 2)
                                    {
                                        asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, 2, diaHtml.Day));
                                        faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, 2, diaHtml.Day));
                                        faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, 2, diaHtml.Day));
                                        auxiliar--;
                                        if (auxiliar == 1)
                                        {
                                            asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, auxiliar, diaHtml.Day));
                                            faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, auxiliar, diaHtml.Day));
                                            faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, auxiliar, diaHtml.Day));
                                            auxiliar = 12;
                                            while (mesCont <= auxiliar)
                                            {
                                                asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                                faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                                faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                                auxiliar--;
                                            }
                                        }
                                    }
                                    break;
                                case 4:
                                    asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, 4, diaHtml.Day));
                                    faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, 4, diaHtml.Day));
                                    faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, 4, diaHtml.Day));
                                    auxiliar = 3;
                                    if (auxiliar == 3)
                                    {
                                        asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, 3, diaHtml.Day));
                                        faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, 3, diaHtml.Day));
                                        faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, 3, diaHtml.Day));
                                        auxiliar = 2;
                                        if (auxiliar == 2)
                                        {
                                            asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, 2, diaHtml.Day));
                                            faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, 2, diaHtml.Day));
                                            faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, 2, diaHtml.Day));
                                            auxiliar--;
                                            if (auxiliar == 1)
                                            {
                                                asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio, auxiliar, diaHtml.Day));
                                                faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio, auxiliar, diaHtml.Day));
                                                faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio, auxiliar, diaHtml.Day));
                                                auxiliar = 12;
                                                while (mesCont <= auxiliar)
                                                {
                                                    asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                                    faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                                    faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                                    auxiliar--;
                                                }
                                            }
                                        }
                                    }
                                    break;
                                case 12:
                                    while (mesCont >= auxiliar)
                                    {
                                        asistenciaAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "A", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                        faltasJustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "J", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                        faltasInjustificadasAcumulada += _objCatalogoAsistencia.contarAsistenciaXidEstudianteXIDDistribucionXIDperiodoXDetalleTipoXMES(idPeriodoActual, codigoDistribucion, item.Id_Alumno, "F", new DateTime(anio - 1, auxiliar, diaHtml.Day));
                                        auxiliar--;
                                    }
                                    break;
                                default:
                                    break;
                            }
                        }
                    }

                    filaDeAsistencia.asistenciaAcumulada = asistenciaAcumulada;
                    filaDeAsistencia.faltasAcumulada = faltasJustificadasAcumulada;
                    filaDeAsistencia.faltasInjustificadasAcumualada = faltasInjustificadasAcumulada;


                    var totalAcumulada = asistenciaAcumulada + faltasInjustificadasAcumulada + faltasJustificadasAcumulada;

                    filaDeAsistencia.totalAsistencia = totalAcumulada;


                    if (asistenciaMesActual != 0)
                    {

                        filaDeAsistencia.asistenciaAcumuladaMesActualPorcentaje = Math.Round((((decimal)asistenciaMesActual / (decimal)totalMesActual) * 100), 2, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        filaDeAsistencia.asistenciaAcumuladaMesActualPorcentaje = 0;
                    }

                    if (asistenciaJustificadaMesActual != 0)
                    {
                        filaDeAsistencia.faltasAcumuladaMesActualPorcentaje = Math.Round((((decimal)asistenciaJustificadaMesActual / (decimal)totalMesActual) * 100), 2, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        filaDeAsistencia.faltasAcumuladaMesActualPorcentaje = 0;
                    }

                    if (asistenciaInjustificadaMesActual != 0)
                    {
                        filaDeAsistencia.faltasInjustificadasAcumuladaMesActualPorcentaje = Math.Round((((decimal)asistenciaInjustificadaMesActual / (decimal)totalMesActual) * 100), 2, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        filaDeAsistencia.faltasInjustificadasAcumuladaMesActualPorcentaje = 0;
                    }



                    if (asistenciaAcumulada != 0)
                    {
                        filaDeAsistencia.asistenciaAcumuladaPorcentaje = Math.Round((((decimal)asistenciaAcumulada / (decimal)totalHoraAcumuladas) * 100), 2, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        filaDeAsistencia.asistenciaAcumuladaPorcentaje = 0;
                    }

                    if ((faltasJustificadasAcumulada + faltasInjustificadasAcumulada) != 0)
                    {
                        filaDeAsistencia.faltasAcumuladaPorcentaje = Math.Round((((decimal)((decimal)faltasJustificadasAcumulada + (decimal)faltasInjustificadasAcumulada) / (decimal)totalHoraAcumuladas) * 100), 2, MidpointRounding.AwayFromZero);

                    }
                    else
                    {
                        filaDeAsistencia.faltasAcumuladaPorcentaje = 0;

                    }


                    if ((asistenciaAcumulada + (faltasJustificadasAcumulada + faltasInjustificadasAcumulada)) != 0)
                    {
                        filaDeAsistencia.totalAsistenciaPorcentaje = Math.Round((((decimal)((decimal)asistenciaAcumulada + (decimal)((decimal)faltasJustificadasAcumulada + (decimal)faltasInjustificadasAcumulada)) / (decimal)totalHoraAcumuladas) * 100), 2, MidpointRounding.AwayFromZero);
                    }
                    else
                    {
                        filaDeAsistencia.totalAsistenciaPorcentaje = 0;
                    }

                    if (filaDeAsistencia.faltasAcumuladaPorcentaje > 15)
                    {
                        nroLista++;
                        filaDeAsistencia.nroEstudiante = nroLista;
                        _objlista.Add(filaDeAsistencia);
                    }
                }

                return _objlista;
            }
            catch (Exception)
            {
                return _objlista;
            }
        }


        public List<asistenciaReporte> reportenNoAprobadosTodosLosMeses(int _idPeriodoActual, int _carrera, int _porcentaje )
        {
           List<asistenciaReporte> _lista = new List<asistenciaReporte>();
            asistenciaReporte parametros = new asistenciaReporte();
            catalogoEstudiante _objEstudiante = new catalogoEstudiante();
            try
            {
                int _numeroEstudiante = 1;
                int contador = 0;
                foreach (var item in _objEstudiante.obtenerEstudiantesPerdidos(_carrera, _idPeriodoActual, _porcentaje))
                {
                    string nombre = item.Alumno;
                    string pivot = nombre;

                    if (item.Orden == 1)
                    {

                        parametros.nombreMateria = item.Materia;
                        parametros.nombreEstudiante = item.Alumno;
                        parametros.NFA1 = item.faltas.ToString();
                        parametros.NFR1 = item.porcFaltas.ToString();
                        parametros.nroEstudiante = _numeroEstudiante;
                    }
                    else if (item.Orden == 2)
                    {
                        parametros.NFA2 = item.faltas.ToString();
                        parametros.NFR2 = item.porcFaltas.ToString();

                    }
                    else if (item.Orden == 3)
                    {
                        parametros.NFA3 = item.faltas.ToString();
                        parametros.NFR3 = item.porcFaltas.ToString();

                    }
                    else if (item.Orden == 4)
                    {
                        parametros.NFA4 = item.faltas.ToString();
                        parametros.NFR4 = item.porcFaltas.ToString();
                    }

                    else if (item.Orden == 5)
                    {
                        parametros.NFA5 = item.faltas.ToString();
                        parametros.NFR5 = item.porcFaltas.ToString();

                    }
                    else
                    {
                        parametros.NFA6 = item.faltas.ToString();
                        parametros.NFR6 = item.porcFaltas.ToString();

                    }
                    if (pivot!=nombre)
                    {
                         _lista.Add(parametros);
                        _numeroEstudiante += 1;
                           
                    }
                   
                }
                
                return _lista;
            }
            catch (Exception)
            {

                return _lista;
            }
        }
    }
}
